package gcp.gui;

import gcp.Usuario;
import gcp.enums.Sexo;
import gcp.principal.FrameGCP;
import gcp.principal.GCP;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.text.MaskFormatter;

/**
 * FrameUsuario<br>
 * Frame responsavel pelo cadastramento de usuarios.
 * @author Hildegard Furtado
 */
public class FrameUsuario extends JInternalFrame {

    private static final long serialVersionUID = 1L;

    private FrameGCP frameGcp;

    private GCP gcp;

    private Container tela;

    private JLabel textoNome, textoSobrenome, textoLogin, textoSenha,
            textoSexo, textoConfSenha, textoCelular, textoDataDeAniversario,
            textoTelefone, textoEndereco, textoEmail;

    private JTextField campoNome, campoSobrenome, campoLogin, campoSenha,
            campoConfSenha, campoEndereco, campoEmail;
    private JTextField campoDataAniversario;
    private JFormattedTextField campoCelular, campoTelefone;
    private JComboBox comboSexo;

    private JButton botaoOk, botaoLimpar, botaoSair;

    private Usuario usuario;

    /**
     * Construtor para FrameCadastrarUsuario
     * @param frameGcp Frame principal do GCP.
     */
    public FrameUsuario(FrameGCP frameGcp, Usuario usuario) {
        super("Cadastros Usuário");
        this.frameGcp = frameGcp;
        this.usuario = usuario;
        gcp = frameGcp.getGcp();
        inicializar();
        posicoes();
        acoes();
        constroiTela();
        carregar();
    }

    /**
     * Carrega os dados do usuário em tela.
     */
    private void carregar() {
        if (usuario != null) {
            campoCelular.setText(usuario.getCelular());
            campoConfSenha.setText(usuario.getSenha());
            campoDataAniversario.setText(new SimpleDateFormat("dd/MM/yyyy")
                    .format(usuario.getDataNascimento()));
            campoEmail.setText(usuario.getEmail());
            campoEndereco.setText(usuario.getEndereco());
            campoLogin.setText(usuario.getLogin());
            campoNome.setText(usuario.getNome());
            campoSenha.setText(usuario.getSenha());
            campoSobrenome.setText(usuario.getSobrenome());
            campoTelefone.setText(usuario.getTelefone());
        }
    }

    /**
     * Inicializa os componentes.
     */
    private void inicializar() {
        setSize(600, 500);
        setClosable(true);
        tela = getContentPane();
        tela.setLayout(null);

        textoNome = new JLabel("Nome: ");
        textoSobrenome = new JLabel("Sobrenome: ");
        textoLogin = new JLabel("Login:  ");
        textoSenha = new JLabel("Senha:  ");
        textoSexo = new JLabel("Sexo: ");
        textoEndereco = new JLabel("Endereço: ");
        textoEmail = new JLabel("Email:  ");
        textoTelefone = new JLabel("Telefone: ");
        textoCelular = new JLabel("Celular: ");
        textoDataDeAniversario = new JLabel("Data de Nascimento: ");
        textoConfSenha = new JLabel("Confirmar senha: ");

        campoNome = new JTextField();
        campoSobrenome = new JTextField();
        campoLogin = new JTextField();
        campoSenha = new JPasswordField();
        campoConfSenha = new JPasswordField();
        campoEmail = new JTextField();
        campoEndereco = new JTextField();

        campoTelefone = criarCampoTelefone();
        campoCelular = criarCampoTelefone();

        campoDataAniversario = criarCampoData();

        botaoOk = new JButton("Ok");
        botaoLimpar = new JButton("Limpar");
        botaoSair = new JButton("Sair");

        comboSexo = new JComboBox();
        comboSexo.addItem(Sexo.SELECIONAR);
        comboSexo.addItem(Sexo.MASCULINO);
        comboSexo.addItem(Sexo.FEMININO);
    }

    /**
     * Cria um campo formatado com a mascara de telefone.
     * @return retorno Campo formatado com a mascara de telefone.
     */
    public JFormattedTextField criarCampoTelefone() {
        JFormattedTextField retorno = null;
        try {
            MaskFormatter mascara = new MaskFormatter("(**) ****-****");
            mascara.setValidCharacters("0123456789 ");
            mascara.setPlaceholderCharacter(' ');
            retorno = new JFormattedTextField(mascara);
        } catch (ParseException e) {}
        return retorno;
    }

    /**
     * Constroi um campo com o formato de data.
     */
    private JTextField criarCampoData() {
        try {
            MaskFormatter mascaraData = new MaskFormatter("**/**/****");
            mascaraData.setPlaceholderCharacter('_');
            mascaraData.setValidCharacters("0123456789 _");
            JFormattedTextField retorno = new JFormattedTextField(mascaraData);
            return retorno;
        } catch (ParseException e) {
            JFormattedTextField retorno = new JFormattedTextField();
            return retorno;
        }
    }

    /**
     * Define a posicao dos componentes em tela.
     */
    private void posicoes() {
        textoLogin.setBounds(10, 10, 40, 27);
        campoLogin.setBounds(45, 10, 300, 27);
        textoSenha.setBounds(10, 40, 45, 27);
        campoSenha.setBounds(50, 40, 100, 27);
        textoConfSenha.setBounds(180, 40, 190, 27);
        campoConfSenha.setBounds(280, 40, 100, 27);
        textoNome.setBounds(10, 70, 45, 27);
        campoNome.setBounds(50, 70, 300, 27);
        textoSobrenome.setBounds(10, 100, 75, 27);
        campoSobrenome.setBounds(80, 100, 300, 27);
        textoDataDeAniversario.setBounds(10, 130, 120, 27);
        campoDataAniversario.setBounds(128, 130, 75, 27);
        textoSexo.setBounds(348, 130, 40, 27);
        comboSexo.setBounds(393, 130, 120, 27);
        textoTelefone.setBounds(10, 220, 60, 27);
        campoTelefone.setBounds(63, 220, 100, 27);
        textoCelular.setBounds(263, 220, 50, 27);
        campoCelular.setBounds(308, 220, 100, 27);
        textoEndereco.setBounds(10, 190, 60, 27);
        campoEndereco.setBounds(68, 190, 500, 27);
        textoEmail.setBounds(10, 160, 50, 27);
        campoEmail.setBounds(50, 160, 300, 27);

        botaoOk.setBounds(440, 300, 100, 25);
        botaoLimpar.setBounds(440, 340, 100, 25);
        botaoSair.setBounds(440, 380, 100, 25);

    }

    /**
     * Define as acoes dos objetos.
     */
    private void acoes() {
        // Ao apertar o botao ok confirmar o cadastro do Usuario
        botaoOk.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                cadastrar();
            }
        });

        // Ao apertar o botao limpar limpa os campos preenchidos
        botaoLimpar.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                campoNome.setText(null);
                campoSobrenome.setText(null);
                comboSexo.setSelectedItem("Selecionar");
                campoLogin.setText(null);
                campoSenha.setText(null);
                campoConfSenha.setText(null);
                campoCelular.setText(null);
                campoDataAniversario.setText(null);
                campoEndereco.setText(null);
                campoEmail.setText(null);
                campoTelefone.setText(null);
            }
        });
        // fecha a janela ao apertar o botao sair
        botaoSair.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
    }

    /**
     * Cria um Usuario e adiciona as informacoes obtidas ao cadastro do Usuario.
     */
    @SuppressWarnings("deprecation")
    protected void cadastrar() {
        String nome = campoNome.getText();
        String sobrenome = campoSobrenome.getText();
        String login = campoLogin.getText();
        String senha = campoSenha.getText();
        String confSenha = campoConfSenha.getText();
        String dataDeNascimento = campoDataAniversario.getText();

        boolean novo = usuario == null;
        if (novo)
            usuario = new Usuario();
        Date date;
        try {
            date = new SimpleDateFormat("dd/MM/yyyy")
                    .parse(dataDeNascimento);
            if (date.getDay() <= 0 || date.getDay() > 31 || date.getMonth() < 0
                    || date.getMonth() > 11 || date.getYear() + 1900 < 1900
                    || date.getYear() + 1900 > 2100) {
                frameGcp.exibirMensagem("A data de nascimento não é válida.");
                return;
            }
        } catch (ParseException e) {
            frameGcp.exibirMensagem("A data de nascimento não é válida.");
            return;
        }
        try {
            if (login.isEmpty()) {
                frameGcp.exibirMensagem("Campo Login deve ser preenchido");
                return;
            }
            if (senha.equals("")) {
                frameGcp.exibirMensagem("Campo senha deve ser preenchido");
                return;
            }
            if (nome.equals("")) {
                frameGcp.exibirMensagem("Campo nome deve ser preenchido");
                return;
            }
            if (sobrenome.equals("")) {
                frameGcp.exibirMensagem("Campo sobrenome deve ser preenchido");
                return;
            }
            if (!senha.equals(confSenha)) {
                frameGcp.exibirMensagem("A senha e a confirmação da senha "
                        + "não são idênticas, por favor digite novamente");
                return;
            }

            usuario.setDataNascimento(date);
            usuario.setLogin(login);
            usuario.setSenha(senha);
            usuario.setNome(nome);
            usuario.setSobrenome(sobrenome);
            usuario.getIdade();
            usuario.setEmail(campoEmail.getText());
            usuario.setEndereco(campoEndereco.getText());
            usuario.setCelular(campoCelular.getText());
            usuario.setSexo((Sexo) comboSexo.getSelectedItem());
            if (novo)
                gcp.adicionaUsuario(usuario);
            dispose();
        } catch (Exception e) {
            frameGcp.exibirMensagem(e.getMessage());
        }
    }

    /**
     * Adiciona componentes em tela.
     */
    private void constroiTela() {
        tela.add(textoNome);
        tela.add(textoSobrenome);
        tela.add(textoLogin);
        tela.add(textoSenha);
        tela.add(textoConfSenha);
        tela.add(textoSexo);
        tela.add(textoDataDeAniversario);
        tela.add(textoEmail);
        tela.add(textoEndereco);
        tela.add(textoTelefone);
        tela.add(textoCelular);

        tela.add(campoTelefone);
        tela.add(campoCelular);

        tela.add(campoNome);
        tela.add(campoSobrenome);
        tela.add(campoLogin);
        tela.add(campoSenha);
        tela.add(campoConfSenha);
        tela.add(campoEmail);
        tela.add(campoEndereco);
        tela.add(campoTelefone);
        tela.add(campoDataAniversario);

        tela.add(botaoOk);
        tela.add(botaoLimpar);
        tela.add(botaoSair);

        tela.add(comboSexo);
    }
}